package cn.deschen.eshop.auth.validate;

import cn.deschen.eshop.auth.enums.ValidateCodeTypeEnum;
import cn.deschen.eshop.common.enums.GlobalEnum;
import cn.deschen.eshop.common.exception.GlobalException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Map;

/**
 * @Author hanbin_chen
 * @Description 验证码选择器
 * @DateTime 2021/1/14 13:44
 * @Version V1.0.0
 */
@Slf4j
@Component
public class ValidateCodeProcessorHolder {

    /**
     * 把ValidateCodeProcessor实现类以 bean名称和bena的实例保存
     */
    @Autowired
    private Map<String, ValidateCodeProcessor> validateCodeProcessorMap;

    /**
     * 根据验证码类型枚举获取对应处理器
     * @param codeTypeEnum
     * @return
     */
    public ValidateCodeProcessor getValidateCodeProcessor(ValidateCodeTypeEnum codeTypeEnum) {
        return getValidateCodeProcessor(codeTypeEnum.getType());
    }

    /**
     * 根据验证码类型获取对应处理器
     * @param codeType
     * @return
     */
    public ValidateCodeProcessor getValidateCodeProcessor(String codeType) {
        // 获取处理器的类名
        String validateCodeProcessorName = codeType + ValidateCodeProcessor.class.getSimpleName();
        // 获取处理器的实例
        ValidateCodeProcessor validateCodeProcessor = validateCodeProcessorMap.get(validateCodeProcessorName);
        // 判断处理器是否存在，不存在报异常
        if (null == validateCodeProcessor) {
            log.info("【权限模块】处理器：{}不存在", validateCodeProcessorName);
            throw new GlobalException(GlobalEnum.EXIST_ERROR, validateCodeProcessorName + "处理器不存在");
        }

        return validateCodeProcessor;
    }
}
